package com.wjh.www.dao;

import java.sql.PreparedStatement;
import java.util.List;
import java.util.Map;

/**
 * @author 26913
 */
public interface SqlRunner {
    /**
     * 把一个非空对象映射成为属性名的集合和属性值的集合
     *
     * @param obj         需要被映射的对象
     * @param fieldNames  将映射的属性名返回在这个集合中
     * @param fieldValues 将映射的属性值返回在这个集合中
     */
    void fieldMapper(Object obj, List<?> fieldNames, List<?> fieldValues);

    /**
     * 向数据库插入数据
     *
     * @param obj 被传进来的封装好的对象
     * @return 返回数据反射改变的行数
     */
    int insert(Object obj);

    /**
     * 把被封装成对象的一行数据从数据库中删除，sql语句在该方法中构造
     *
     * @param obj 被封装成对象的一行数据，需要被删除的对象（即where条件）
     * @return 返回数据发送改变的行数
     */
    int delete(Object obj);

    /**
     * 通过id来修改数据库中的数据
     *
     * @param obj 被传入的对象，携带新的数据（该对象必须携带id）
     * @return 返回数据发生改变的行数
     */
    int updateById(Object obj);

    /**
     * 通过map集合中的条件来修改数据库中的数据
     *
     * @param obj 被传入的对象，携带新的数据
     * @param map 条件
     * @return 返回数据发生改变的行数
     */
    int updateByMap(Object obj, Map<String, Object> map);

    /**
     * 封装增、删、改操作的方法
     *
     * @param obj    传入的对象，用于设置占位符“？”
     * @param params 离散的参数,如果没有参数需要填，则赋值为null即可
     * @param sql    传入的sql语句
     * @return 返回数据发生改变的行数
     */
    int executeUpdate(Object obj, Object[] params, String sql);

    /**
     * 执行一条预编译指令，并且填入参数
     *
     * @param sql    要执行的预编译sql语句
     * @param params 离散的参数,如果没有参数需要填，则赋值为null即可
     * @param obj    以对象形式传入的参数
     * @return java.lang.Object
     */
    Object executeQuery(String sql, Object[] params, Object obj);

    /**
     * 设置占位符的通用方法
     *
     * @param obj 用于设置占位符的对象
     * @param ps  PreparedStatement对象
     */
    void setParams(Object obj, PreparedStatement ps);

    /**
     * 用于给sql语句填充参数（方法的重载）
     *
     * @param ps     PreparedStatement对象
     * @param params 携带参数的数组
     */
    void setParams(PreparedStatement ps, Object[] params);

    /**
     * 封装查操作的方法
     *
     * @param params 离散的参数
     * @param obj    传入的对象，用于设置占位符“？”
     * @param clazz  返回的List集合的具体类型
     * @param sql    传入的sql语句
     * @return 返回List集合
     */
    List<?> queryList(Object[] params, Object obj, Class<?> clazz, String sql);


    /**
     * 查询一个实体对象
     *
     * @param params 离散的参数
     * @param obj    返回一个实体对象
     * @param clazz  返回的实体对象的具体类型
     * @param sql    传入的sql
     * @return 返回的实体对象
     */
    Object queryObject(Object[] params, Object obj, Class<?> clazz, String sql);

    /**
     * 执行一条sql语句，返回一个字段的值
     *
     * @param sql    查询的预编译sql语句
     * @param params 预编译的参数,如果没有参数需要填，则赋值为null即可
     * @param obj    以对象形式传入的参数
     * @return 查询的字段值
     */
    Object queryField(String sql, Object[] params, Object obj);

    /**
     * 拼接where条件的sql语句
     *
     * @param obj    被封装成对象where条件
     * @param fields 要查询的字段名
     * @return 返回sql语句（字符串）
     */
    String getSelectSql(Object obj, String fields);

}
